/**
 * 用户反馈API工具模块
 */

// API配置
const FEEDBACK_API_CONFIG = {
  baseUrl: 'https://api.example.com/feedback', // 替换为实际的反馈API地址
  apiVersion: 'v1',
  timeout: 10000, // 10秒超时
  useMock: true // 设置为使用mock模式，避免实际API调用失败
};

/**
 * 反馈类型枚举
 */
const FeedbackTypes = {
  SUGGESTION: 'suggestion', // 功能建议
  CONTENT: 'content',       // 内容纠错
  BUG: 'bug',               // 操作问题
  OTHER: 'other'            // 其他问题
};

/**
 * 表单验证器
 */
const Validator = {
  /**
   * 验证反馈内容是否有效
   * @param {Object} feedbackData - 反馈数据对象
   * @returns {boolean} 是否有效
   */
  isValid(feedbackData) {
    // 验证类型
    if (!feedbackData.type || !Object.values(FeedbackTypes).includes(feedbackData.type)) {
      return false;
    }
    
    // 验证内容不为空且不超过200字
    if (!feedbackData.content || feedbackData.content.trim() === '' || 
        feedbackData.content.length > 200) {
      return false;
    }
    
    return true;
  },
  
  /**
   * 获取验证错误消息
   * @param {Object} feedbackData - 反馈数据对象
   * @returns {string|null} 错误消息，无错误则返回null
   */
  getErrorMessage(feedbackData) {
    if (!feedbackData.type || !Object.values(FeedbackTypes).includes(feedbackData.type)) {
      return '请选择反馈类型';
    }
    
    if (!feedbackData.content || feedbackData.content.trim() === '') {
      return '请输入反馈内容';
    }
    
    if (feedbackData.content.length > 200) {
      return '反馈内容不能超过200字';
    }
    
    return null;
  }
};

/**
 * 提交用户反馈
 * @param {Object} feedbackData - 反馈数据对象
 * @param {string} feedbackData.type - 反馈类型
 * @param {string} feedbackData.content - 反馈内容
 * @param {string} feedbackData.contact - 联系方式(可选)
 * @returns {Promise<Object>} - 提交结果
 */
function submitFeedback(feedbackData) {
  return new Promise((resolve, reject) => {
    // 验证表单数据
    if (!Validator.isValid(feedbackData)) {
      const errorMessage = Validator.getErrorMessage(feedbackData);
      reject(new Error(errorMessage || '表单数据无效'));
      return;
    }
    
    // 在本地存储中保存用户联系方式，便于下次自动填充
    if (feedbackData.contact) {
      try {
        wx.setStorageSync('userContactInfo', feedbackData.contact);
      } catch (e) {
        console.warn('保存联系方式到本地失败', e);
      }
    }
    
    // 显示加载提示
    wx.showLoading({
      title: '提交中...',
      mask: true
    });
    
    // 使用mock模式，仅在本地记录
    if (FEEDBACK_API_CONFIG.useMock) {
      setTimeout(() => {
        wx.hideLoading();
        try {
          // 将反馈存储到本地
          const feedbackHistory = wx.getStorageSync('feedbackHistory') || [];
          feedbackHistory.push({
            ...feedbackData,
            id: 'mock_' + Date.now(),
            createTime: new Date().toISOString(),
            status: 'submitted'
          });
          wx.setStorageSync('feedbackHistory', feedbackHistory);
          
          resolve({
            success: true,
            message: '反馈提交成功'
          });
        } catch (e) {
          console.error('本地存储反馈失败', e);
          reject(new Error('提交反馈失败，请稍后再试'));
        }
      }, 1000); // 模拟网络延迟
      return;
    }
    
    // 实际API调用
    wx.request({
      url: FEEDBACK_API_CONFIG.baseUrl,
      method: 'POST',
      timeout: FEEDBACK_API_CONFIG.timeout,
      header: {
        'Content-Type': 'application/json'
      },
      data: {
        type: feedbackData.type,
        content: feedbackData.content,
        contact: feedbackData.contact || '',
        timestamp: Date.now(),
        appVersion: getApp().globalData.version || '1.0.0',
        clientInfo: {
          platform: wx.getSystemInfoSync().platform,
          system: wx.getSystemInfoSync().system
        }
      },
      success: (res) => {
        wx.hideLoading();
        if (res.statusCode === 200 && res.data && res.data.success) {
          // 提交成功，保存到本地历史
          try {
            const feedbackHistory = wx.getStorageSync('feedbackHistory') || [];
            feedbackHistory.push({
              ...feedbackData,
              id: res.data.id || Date.now(),
              createTime: new Date().toISOString(),
              status: 'submitted'
            });
            wx.setStorageSync('feedbackHistory', feedbackHistory);
          } catch (e) {
            console.warn('保存反馈历史到本地失败', e);
          }
          
          resolve(res.data);
        } else {
          const errorMsg = (res.data && res.data.message) || '提交失败，请稍后再试';
          console.error('反馈提交失败:', res);
          reject(new Error(errorMsg));
        }
      },
      fail: (err) => {
        wx.hideLoading();
        console.error('反馈提交请求失败:', err);
        
        // 在网络错误情况下，尝试保存到本地
        try {
          const feedbackHistory = wx.getStorageSync('feedbackHistory') || [];
          feedbackHistory.push({
            ...feedbackData,
            id: 'offline_' + Date.now(),
            createTime: new Date().toISOString(),
            status: 'pending', // 标记为待提交状态
            error: err.errMsg || JSON.stringify(err)
          });
          wx.setStorageSync('feedbackHistory', feedbackHistory);
        } catch (e) {
          console.error('保存到本地失败', e);
        }
        
        reject(new Error('网络错误，反馈已暂存'));
      }
    });
  });
}

/**
 * 获取用户历史反馈记录
 * @returns {Array} 反馈历史记录
 */
function getFeedbackHistory() {
  try {
    return wx.getStorageSync('feedbackHistory') || [];
  } catch (e) {
    console.error('获取反馈历史失败', e);
    return [];
  }
}

/**
 * 获取存储的联系方式
 * @returns {string} 联系方式
 */
function getSavedContactInfo() {
  try {
    return wx.getStorageSync('userContactInfo') || '';
  } catch (e) {
    console.warn('获取存储的联系方式失败', e);
    return '';
  }
}

module.exports = {
  FeedbackTypes,
  Validator,
  submitFeedback,
  getFeedbackHistory,
  getSavedContactInfo
}; 